package com.zhengbing.tj.common;

import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;

/**
 * 密码校验工具类
 * 提供密码强度校验功能，通过正则表达式验证密码是否符合安全要求
 * 适用于用户注册、密码修改等需要验证密码强度的场景
 * 
 * @author zhengbing
 * @date 2025-08-11
 */
public class PasswordValidator {

    /**
     * 校验密码是否符合要求
     * 要求：
     * 1. 不为空
     * 2. 长度至少8位
     * 3. 包含至少一个大写字母
     * 4. 包含至少一个小写字母
     * 5. 包含至少一个数字
     * 6. 包含至少一个特殊字符（非字母数字）
     *
     * @param password 待校验的密码
     * @return 校验通过返回true，否则返回false
     */
    public static boolean validate(String password) {
        if (StrUtil.isBlank(password) || password.length() < 8) {
            return false;
        }
        // 包含大写字母
        if (!ReUtil.isMatch(".*[A-Z].*", password)) {
            return false;
        }
        // 包含小写字母
        if (!ReUtil.isMatch(".*[a-z].*", password)) {
            return false;
        }
        // 包含数字
        if (!ReUtil.isMatch(".*\\d.*", password)) {
            return false;
        }
        // 包含特殊字符
        if (!ReUtil.isMatch(".*[^A-Za-z0-9].*", password)) {
            return false;
        }
        return true;
    }

    /**
     * 校验密码是否符合要求，如果不符合则抛出异常
     *
     * @param password 待校验的密码
     * @throws TjException 密码不符合要求时抛出异常
     */
    public static void validateOrThrow(String password) {
        if (!validate(password)) {
            throw new TjException("密码必须至少8位，包含大小写字母、数字和特殊字符");
        }
    }
}